#ifndef USART_PORT_H
#define USART_PORT_H
#include <stdbool.h>
#include "stm32f4xx_hal.h"
#define USART_UX USART6 //printf使用的串口


/******************************************************************************************/

#define USART_PORT_NUM 1 /* 串口数量 */
#define USART_REC_LEN 400 /* 定义最大接收字节数 200 */
#define USART_EN_RX 1     /* 使能（1）/禁止（0）串口1接收 */

#define USART_MALLOC 0 /* 串口接收缓冲区使用malloc动态分配内存 */

typedef struct USART_Data {
  UART_HandleTypeDef *huart;
  uint8_t rxBuffer; /* HAL库使用的串口接收缓冲 */

  /*  接收状态
   *  bit15，      接收完成标志
   *  bit14，      接收到0x0d
   *  bit13~0，    接收到的有效字节数目
   */
  uint16_t usart_rx_sta;    
  uint16_t rxSize_Max;  /* 接收缓冲大小 */
  uint8_t *usart_rx_buf; /* 接收缓冲, 最大rxSize_Max个字节,在Init中动态分配 */
	//uint8_t usart_rx_buf[0];
} USART_Data;
//p=(USART_Data*)malloc(sizeof(USART_Data)+RX_BUF);
extern USART_Data g_usartData[USART_PORT_NUM];
#if USART_MALLOC == 1
void USART_DataTypeInit(USART_Data *this, UART_HandleTypeDef *huart,
                        uint16_t rxSize_Max, uint8_t receiveMode);
#else 
void USART_DataTypeInit(USART_Data *this, UART_HandleTypeDef *huart,
                        uint8_t* rxBuffer, uint16_t rxSize_Max, uint8_t receiveMode);
#endif
/// @brief 数据接收是否完成
/// @param  this 指向要查看的串口的数据结构体的指针
/// @return true 接收完成 false 接收未完成
static inline bool USART_DataIsReceived(USART_Data *this)
{
    return (this->usart_rx_sta & 0x8000);
}
/// @brief 串口接收到的数据长度
/// @param  this 指向要查看的串口的数据结构体的指针
/// @return  接收到的数据长度，最大为2^14-1
static inline uint16_t USART_DataGetReceivedLen(USART_Data *this)
{
    return (this->usart_rx_sta & 0x3fff);
}

/// @brief 清除接收完成标志位
/// @param  this 指向要查看的串口的数据结构体的指针
static inline void USART_DataResetReceivedFlag(USART_Data *this)
{
    this->usart_rx_sta &= 0x7fff;
    this->usart_rx_sta = 0;//清空接收状�??
}
#endif  // USART_PORT_H
